﻿using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Tanmia.Basis.Core;

namespace Tanmia.Warehouse.Core
{
    /// <summary>
    /// تعرف وحدات القياس التي تستعملها مادة معينة
    /// </summary>
    public class ItemUnit : BaseBusinessObject
    {
        private const string patternNumber = "^[0-9]+";

        private int itemUnitID;
        private Item item;
        private Unit baseUnit;
        private double scale;
        private Unit unit;
        private IList<ItemUnitPrice> itemUnitPrices;

        /// <summary>
        /// المادة التي تتبع لها وحدة القياس الحالية
        /// </summary>
        [Display(Name = "المادة: ", ShortName = "المادة", Order = 3, AutoGenerateField = false)]
        public virtual Item Item
        {
            get { return item; }
            set { SetValue<Item>("Item", ref item, value); }
        }

        [Display(Name = "رقم وحدة قياس المادة: ", ShortName = "رقم وحدة قياس المادة", Order = 0, AutoGenerateField = false)]
        public virtual int ItemUnitID
        {
            get { return itemUnitID; }
            set { SetValue<int>("ItemUnitID", ref itemUnitID, value); }
        }

        /// <summary>
        /// وحدة القياس الأساسية
        /// </summary>
        [Display(Name = "الوحدة الأساسية: ", ShortName = "الوحدة الأساسية", Order = 1, AutoGenerateField = true)]
        [Required(ErrorMessage = "يجب تحديد وحدة القياس الأساسية")]
        public virtual Unit BaseUnit
        {
            get { return baseUnit; }
            set { SetValue<Unit>("BaseUnit", ref baseUnit, value); }
        }

        /// <summary>
        /// عامل الضرب لواحدة القياس هذه, القيمة الموجودة في هذه الخاصية سوف يتم ضربها دائماً بالعدد واحد.
        /// </summary>
        [Display(Name = "عامل الضرب: ", ShortName = "عامل الضرب", Order = 2, AutoGenerateField = true)]
        [Required(ErrorMessage = "يجب تحديد عامل الضرب")]
        [RegularExpression(patternNumber, ErrorMessage="يجب أن يكون {0} رقماً.")]
        public virtual double Scale
        {
            get { return scale; }
            set { SetValue<double>("Scale", ref  scale, value); }
        }

        /// <summary>
        /// واحدة القياس
        /// </summary>
        [Required(ErrorMessage = "يجب تحديد وحدة القياس")]
        [Display(Name = "وحدة القياس: ", ShortName = "وحدة القياس", Order = 3, AutoGenerateField = true)]
        public virtual Unit Unit
        {
            get { return unit; }
            set { SetValue<Unit>("Unit", ref  unit, value); }
        }

        /// <summary>
        /// قائمة بأسعار المادة من واحدة القياس الحالية
        /// </summary>
        public virtual IList<ItemUnitPrice> ItemUnitPrices
        {
            get { return itemUnitPrices; }
            set { SetValue<IList<ItemUnitPrice>>("ItemUnitPrices", ref itemUnitPrices, value); }
        }

        public override bool IsEmpty
        {
            get { return ItemUnitID == 0; }
        }

        public override bool Equals(object obj)
        {
            if (!base.Equals(obj)) return false;

            ItemUnit itemUnit = obj as ItemUnit;

            if (!itemUnit.ItemUnitID.Equals(this.ItemUnitID)) return false;
            if (!object.Equals(itemUnit.BaseUnit, BaseUnit)) return false;
            if (!object.Equals(itemUnit.Unit, Unit)) return false;
            if (!itemUnit.Scale.Equals(Scale)) return false;

            return true;
        }
    }
}
